package week03review;

import java.util.Arrays;

/**
 * 1.正则表达式:
 *      用于描述字符串的内容和格式，使用它通常用于匹配一个字符串是否符合格式要求
 * 2.String支持正则表达式的方法:
 *    - matches()：匹配，使用给定的正则表达式验证当前字符串的格式是否符合要求，若符合则返回true，不符合则返回false
 *    - replaceAll()：替换，将当前字符串中满足正则表达式的部分给替换为指定字符串
 *    - split()：拆分，将当前字符串按照满足正则表达式的部分进行拆分，将拆分出的以String[]形式返回
 * 3. Object：
 * - 是所有类的鼻祖，所有类都直接或间接继承了Object，万物皆对象，为了多态
 * - Object中有两个经常被派生类重写的方法：toString()和equals()
 * - 调用Object类的toString()时默认返回：类的全称@hashcode值，没有参考意义，所以常常重写toString()来返回具体的属性值
 *     > 注意：String、StringBuilder都重写了toString()来返回具体的字符串内容了
 * - 调用Object类的equals()时默认比较的还是==(即比较地址)，没有参考意义，所以常常重写equals()来比较具体的属性值
 *        > 注意事项：
 *        > 1. String类、包装类重写了equals()来比较内容是否相等，但StringBuilder并没有。
 *        > 2. 重写equals()的基本原则：
 *        >    - 原则上要比较两个对象的属性值是否相同
 *        >    - 两个对象必须是同一类型的，若类型不同则直接返回false
 * 4.包装类:
 * -java定义了8个包装类，目的就是为了解决基本类型不能直接参与面向对象开发的问题，使基本类型可以通过包装类的形式存在。
 * - 包含：Integer、Character、Byte、Short、Long、Float、Double、Boolean，
 * - 其中Character和Boolean是直接继承自Object类的，其余6个包装类继承自Number类。
 * - JDK1.5时推出了一个新特性：自动拆装箱。当编译器编译时若发现是基本类型与包装类型之间的相互赋值，则自动补齐代码完成转换工作，这个过程叫做自动拆装箱。
 * */
public class String02Test {
    public static void main(String[] args) {
        /*
        [a-z]  [A-Z]  [a-zA-Z0-9_]  [^abc]
        .:表示任意一个字符，没有范围限制
        \d:表示任意一个数字==[0-9]
        \w:表示任意一个单词字符==[a-zA-Z0-9_]
        \s:表示任意一个空白字符
        \D:不是数字
        \W:不是单词字符
        \S:不是空白字符
        ? 表示前面的内容出现0-1次
        + 表示前面出现的内容至少出现一次
        * 表示前面内容可以出现任意次
        {n}:表示前面的内容出现n次
        {n,m}:出现最少n此最多m次
        {n,}:出现n次以上(含n次)
        (abc|def){3}表示abc或def整体出现3次.
        */

        /*
        * 邮箱正则表达式:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
        * */

        String email = "wxywxy@qq.com";
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        boolean match = email.matches(regex);
        if (match){
            System.out.println("是正确的");
        }else {
            System.out.println("不是正确的");
        }

        String line ="abc123def456ghi";
        line = line.replaceAll("[0-9]+","number");
        System.out.println(line);

        String line1 = "123adc456def789hij";
        String[] data = line1.split("[0-9]+");
        System.out.println(Arrays.toString(data));


        //包装类
        Integer i1 = new Integer(5);
        Integer i2 = new Integer(5);
        System.out.println(i1==i2); //false，==比较的是地址
        System.out.println(i1.equals(i2)); //true，包装类重写equals()比较值了

        //valueOf()方法会复用1个字节(-128到127)范围内的数据，建议使用valueOf()
        Integer i3 = Integer.valueOf(5);
        Integer i4 = Integer.valueOf(5);
        System.out.println(i3==i4); //true
        System.out.println(i3.equals(i4)); //true，包装类重写equals()比较值了

        //将包装类转换为基本类型
        int i = i4.intValue();
        System.out.println(i);

        //2)包装类可以将字符串转换为对应的基本类型----必须熟练掌握
        String s1 = "39";
        int age = Integer.parseInt(s1); //将字符串s1转换为int类型并赋值给age
        System.out.println(age); //39---int类型

        String s2 = "123.456";
        double price = Double.parseDouble(s2); //将字符串s2转换为double类型并赋值给price
        System.out.println(price); //123.456----double类型

        //触发了自动装箱特性，会被编译为: Integer j = Integer.valueOf(5);
        Integer j = 5; //基本类型到包装类-------装箱
        //触发了自动拆箱特性，会被编译为: int j1 = j.intValue();
        int j1 = i; //包装类到基本类型-----------拆箱
    }
}
